/* 引入数据库模型其他模块 */
const { User,Article, mongo} = require('./app.js')


const jwt = require('jsonwebtoken')
/* 引入数据库中间件 bodyParser 可以解析请求体格式*/
const bodyParser = require('body-parser')
/* 引入express函数 */
const express = require('express')
/* 创建一个express函数实例对象 */
const app = express()


mongo(app)
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())


/* 配置跨域cors */
app.use(require('cors')())
/* 让服务器识别客户端传过来的json数据 */
app.use(express.json())


//验证用户-中间件
const isAdmin = async (req , res, next) =>{
    //console.log( req.headers.authorization)
//因为token规范 请求数据是Bearer 6271179e9ae16bec9ec74a55.111 这种形式的
    //通过split方法 拿到后边的token
    const token = req.headers.authorization.split(' ')[1]
    //通过split方法 拿到token 前面的用户id
    const id = token.split('.')[0]
    const userdata = token.split('.')[1]
    //console.log(id,userdata)
    //检查用户是否存在
    const checkuser = await User.findById(id)
    if(!checkuser){
        return res.status(422).send('用户不存在')
    }
    if( userdata !== checkuser.username){
        res.status(422).send('账户错误')
    }else{
        //用户存在判断权限
         if(checkuser.isAdmin === '0'){
            res.status(422).send('没有Admin权限')
         }else if(checkuser.isAdmin === '1'){
            next()
         } 
            //next()
        }
    }
// 登陆接口
app.post('/api/login', async (req , res) =>{
    //将获取到的用户信息存入用户数据库
    const user = await User.findOne({
        username:req.body.username
    })
    //如果用户账号和数据库不匹配
    if(!user){
        return res.status(422).send(/* {
           message: '账号不存在'
        } */ '账号不存在')
    }
    //用户密码进行和数据库比较
    const isPasswordValid = require('bcrypt').compareSync(
        //用户网页输入的密码
        req.body.password,
        //数据库中加密的密码
        user.password
    )
    //如果用户密码和数据库不匹配
    if(!isPasswordValid){
        return res.status(422).send(/* {
           message: '密码错误'
        } */ '密码错误')
    }

    const token = user._id + '.' + req.body.username

    //如果用户密码和数据库匹配成功
    if(isPasswordValid){
        res.send({
            token,
            isPasswordValid
        })
    }
    //res.send( isPasswordValid )
    //console.log( isPasswordValid )
    //console.log( req )
    //console.log( {user})
    //res.send( user)
})

//验证用户
app.get('/api/verify', async (req , res) =>{ 
   console.log( req.headers.authorization)
//因为token规范 请求数据是Bearer 6271179e9ae16bec9ec74a55.111 这种形式的
    //通过split方法 拿到后边的token
    const token = req.headers.authorization.split(' ')[1]
    //通过split方法 拿到token 前面的用户id
    const id = token.split('.')[0]
    const userdata = token.split('.')[1]
    console.log(id,userdata)
    //检查用户是否存在
    const checkuser = await User.findById(id)
    if(!checkuser){
        return res.status(422).send('用户不存在')
    }
    if( userdata !== checkuser.username){
        res.status(422).send('账户错误')
    }else{
        //用户存在判断权限
         if(checkuser.isAdmin === '0'){
            res.status(422).send('没有Admin权限')
        }else if(checkuser.isAdmin === '1'){            
            res.send( 'Admin权限')
        }
    }         
})



// 注册接口
app.post('/api/register', async (req , res) =>{
    //查询是否存在相同账户
    const usercheck = await User.findOne({
        username:req.body.username
    })
    //console.log(usercheck)
    //console.log(req.body.username)
    
    if( usercheck == null){
        //将获取到的用户信息存入用户数据库
        const user = await User.create({
        username: req.body.username,
        password: req.body.password,
        isAdmin:req.body.isAdmin
     })
      res.send( user)
    }
    else if( usercheck.username == req.body.username){
        return res.status(409).send('用户已存在')
    } 
    
})


//查询用户信息
app.get('/api/users', async (req , res) =>{
    const userAll = await User.find()
    res.send(userAll)
})

//删除用户信息
app.delete('/api/users/:id', isAdmin, async (req , res) =>{
    const userdelete = await User.findByIdAndDelete( req.params.id)
    res.send({
        status: true
    })
})


app.get('/', async (req , res) =>{
    res.send( '页面跳转中')
})
/* 创建文章 */
app.post('/api/articles' , async (req , res) =>{
    /* console.log(req) */
    /* 用模型的create方法创建数据；内容是前端传过来的 */
    const article = await Article.create(req.body)
    res.send(article)
})
/* 显示所有文章 */
app.get('/api/articles' , async (req , res) =>{
    /* find方法查询数据库所有数据 */
    const articles = await Article.find()
    res.send({articles})
})

/* 删除文章;需要删除指定id的数据*/
app.delete('/api/articles/:id' ,async (req , res) =>{
    /* 使用delete方法 需要的(req.params.参数) 和路径中动态绑定参数要一致 */
    await Article.findByIdAndDelete( req.params.id)
    /* find方法查询数据库所有数据 */
    const articles = await Article.find()
    /* 返回查询到的数据库数据和一个参数作为状态 告诉前端 删除成功 */
    res.send({
        articles,
        status: true })
})

app.put('/api/articles/:id',async (req , res) =>{
    /* Update方法接收2个参数；将查询到的数据更新为后一个参数内容 */
    const article = await Article.findByIdAndUpdate(req.params.id , req.body)
    res.send({
        article,
        status: true })
    
})

/* 获取当前需要编辑文章的数据 */
app.get('/api/articles/:id',async (req , res) =>{
    /* 拿到指定id的数据 */
    const article = await Article.findById(req.params.id)
    res.send(article)
})

/* 监听端口 */
app.listen(3001, () => {
    console.log('http://localhost:3001/')
    console.log('端口启动了')
})